package cn.tedu.smartos.activity.mapper;

import cn.tedu.smartos.activity.pojo.dto.ActivityQuery;
import cn.tedu.smartos.activity.pojo.dto.ActivityUpdateParam;
import cn.tedu.smartos.activity.pojo.dto.ParticipationAddParam;
import cn.tedu.smartos.activity.pojo.dto.ParticipationCheckoutParam;
import cn.tedu.smartos.activity.pojo.entity.Activity;
import cn.tedu.smartos.activity.pojo.entity.ActivityCategory;
import cn.tedu.smartos.activity.pojo.entity.ActivityParticipation;
import cn.tedu.smartos.activity.pojo.vo.ActivityCategoryVO;
import cn.tedu.smartos.activity.pojo.vo.ActivityVO;
import cn.tedu.smartos.baseuser.pojo.entity.User;
import cn.tedu.smartos.volunteer.pojo.vo.VolunteerInfoVO;
import com.github.pagehelper.Page;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface ActivityMapper {
    // 活动列表查询
    Page<ActivityVO> list(ActivityQuery query);

    // 获取用户参与的活动列表
    List<ActivityVO> selectActivitiesByUserId(Long userId);

    // 活动详情
    ActivityVO detail(Long activityId);

    // 删除活动
    int delete(List<Long> activityIds);

    // 更新活动
    int update(Activity activity);

    // 新增活动
    int insert(Activity activity);

    // 待审核活动列表
    Page<ActivityVO> waitAudit(ActivityQuery query);

    // 添加活动分类
    int insertCategory(ActivityCategory activityCategory);

    // 删除活动分类
    int deleteCategory(List<Integer> categoryIds);

    // 更新活动分类
    int updateCategory(ActivityCategory activityCategory);

    // 活动分类列表
    Page<ActivityCategoryVO> listCategory(ActivityQuery query);

    // 报名活动
    int insertParticipation(ActivityParticipation participation);

    // 更新参与状态
    int updateParticipationStatus(ActivityUpdateParam param);

    // 更新活动参与人数
    int incrementParticipants(@Param("activityId") Long activityId,
                              @Param("increment") int increment);

    // 根据用户名查询用户
    User selectUserByUsername(String username);

    // 根据ID查询活动
    ActivityVO selectActivityById(Long activityId);

    // 查询志愿者信息
    VolunteerInfoVO selectVolunteerInfoByUserId(Long userId);

    // 增加服务时长
    int incrementServiceHours(@Param("volunteerId") Long volunteerId,
                              @Param("hours") Double hours);

    // 添加积分记录
    int addPointsRecord(@Param("userId") Long userId,
                        @Param("points") Integer points,
                        @Param("changeType") Integer changeType,
                        @Param("remark") String remark);

    // 签退
    int checkout(ActivityParticipation participation);

    // 检查是否已报名
    int countParticipation(@Param("activityId") Long activityId,
                           @Param("userId") Long userId);

    // 获取参与状态
    int getParticipationStatus(@Param("activityId") Long activityId,
                               @Param("userId") Long userId);
    // 更新活动状态
    int updateActivityStatus(@Param("activityId") Long activityId,
                             @Param("status") Integer status);
    Activity selectByPrimaryKey(Long activityId);
}